package busterminal.persistence.memory;

import busterminal.entity.ScheduledItem;
import busterminal.entity.service.DaysOfWeek;
import busterminal.persistence.ScheduledItemDAO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Реализация интерфейса Data Access Object для пункта расписания для работы с коллекцией
 */
class MemoryScheduledItemDAO extends AbstractMemoryDAO<ScheduledItem> implements ScheduledItemDAO {

    /**
     * Коллекция, содержащая все пункты расписания
     */
    private static Map<Integer, ScheduledItem> dataSource = new HashMap<Integer, ScheduledItem>();
    /**
     * Идентификатор пункта расписания
     */
    private static Integer counter = 1;

    /**
     * Конструктор по умолчанию
     */
    public MemoryScheduledItemDAO() {
    }

    /**
     * Получить коллекцию, содержащую все пункты расписания
     * @return коллекция
     */
    @Override
    protected Map<Integer, ScheduledItem> getDataSource() {
        return dataSource;
    }

    /**
     * Получить идентификатор пункта расписания и увеличить его на единицу
     * @return идентификатор
     */
    @Override
    protected Integer getAndIncreaseCounter() {
        return counter++;
    }

    /**
     * Найти пункты расписания по дням недели осуществления маршрутов
     * @param routingDays дни недели осуществления маршрутов
     * @return список найденных пунктов расписания
     */
    @Override
    public List<ScheduledItem> findByRoutingDays(List<DaysOfWeek> routingDays) {
        List<ScheduledItem> list = new ArrayList<ScheduledItem>();
        for (DaysOfWeek day : routingDays) {
            for (ScheduledItem scheduledItem : dataSource.values()) {
                if (scheduledItem.getRoutingDays().contains(day)) {
                    if (!list.contains(scheduledItem)) {
                        list.add(scheduledItem);
                    }
                }
            }
        }
        return list;
    }
}
